Cloudflare RegistrarのドメインをTerraformで管理している
既存のリソースの取り込み
全ての種類のリソースを取り込める訳ではないけど色々と取り込める
複数ドメインの管理
複数のドメインを1個のモジュールで管理するのはしんどいのでドメイン単位でモジュールを切ると便利
こういうディレクトリ構成
https://gyazo.com/c5a51c630ee65a95ac9709b3853c1d85
最初はcloudflare_accountもモジュール内に置いていた
後からよく考えるとアカウントはZone依存ではないのとドメイン以外もTerraformで管理しようとしたらZoneに依存しない形でAccount IDが必要だったのでルートに置くようにした
以前のディレクトリ構成
https://gyazo.com/1e61ec5606644c27d301137b36a5011c
モジュール側
モジュール側ではProviderのバージョン指定とかAPIトークンの設定はしない
code:/example_com/terraform.tf
terraform {
required_providers {
cloudflare = {
source = "cloudflare/cloudflare"
}
}
}
cloudflare_zoneを使うことで変数でZone IDを注入する必要がなくなる
account_idはルートから変数で指定
code:/example_com/zone.tf
resource "cloudflare_zone" "main" {
account_id = var.cloudflare_account_id
zone = "example.com"
}
リソースはよしなに設定する
DNSのMXレコードだとこうなる
zone_idはcloudflare_zone.main.idを参照,ドメイン名はcloudflare_zone.main.zoneを参照すれば良い
code:/example_com/record.tf
resource "cloudflare_record" "mx_1" {
zone_id = cloudflare_zone.main.id
name = cloudflare_zone.main.zone
type = "MX"
value = "route1.mx.cloudflare.net"
priority = 57
}
プロジェクトルート
code:/example_com/account.tf
resource "cloudflare_account" "main" {
name = "hiroxto"
type = "standard"
enforce_twofactor = true
}
main.tfではモジュールを参照するだけ
Account IDだけ渡す
code:/main.tf
module "example_com" {
source = "./example_com"
cloudflare_account_id = cloudflare_account.main.id
}
Providerのバージョンはプロジェクトルートで定義
code:/terraform.tf
terraform {
required_version = ">= 1.7.0"
required_providers {
cloudflare = {
source = "cloudflare/cloudflare"
version = "4.28.0"
}
}
}
APIトークンもプロジェクトルートで設定する
code:/providers.tf
provider "cloudflare" {
api_token = var.cloudflare_api_token
}